package cn.iocoder.yudao.module.system.util;

import cn.hutool.core.util.StrUtil;

import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.Set;

/**
 * 学校名称工具类
 * 用于处理不同格式的学校名称匹配
 *
 * @author 芋道源码
 */
public class SchoolNameUtils {

    /**
     * 生成学校名称的所有可能变体（用于模糊匹配）
     * 处理不同的括号格式和带不带括号的情况
     *
     * @param schoolName 学校名称
     * @return 学校名称的所有变体（去重）
     */
    public static Set<String> generateSchoolNameVariants(String schoolName) {
        if (StrUtil.isBlank(schoolName)) {
            return Collections.emptySet();
        }

        Set<String> variants = new LinkedHashSet<>();

        // 1. 原始名称
        variants.add(schoolName);

        // 2. 中文括号 → 英文括号
        String withEnglishBrackets = schoolName.replace("（", "(").replace("）", ")");
        variants.add(withEnglishBrackets);

        // 3. 英文括号 → 中文括号
        String withChineseBrackets = schoolName.replace("(", "（").replace(")", "）");
        variants.add(withChineseBrackets);

        // 4. 去掉括号但保留内容：合肥工业大学(宣城校区) → 合肥工业大学宣城校区
        String noBrackets1 = schoolName.replace("（", "").replace("）", "");
        variants.add(noBrackets1);

        String noBrackets2 = schoolName.replace("(", "").replace(")", "");
        variants.add(noBrackets2);

        // 5. 如果不带括号，尝试生成带括号的版本
        // 针对"XX大学YY校区"、"XX大学YY分校"等格式
        if (!schoolName.contains("(") && !schoolName.contains("（")) {
            // 匹配模式：XX大学YY校区、XX大学YY分校、XX学院YY校区等
            String[] suffixes = {"校区", "分校"};
            for (String suffix : suffixes) {
                if (schoolName.contains(suffix)) {
                    // 找到最后一个"大学"或"学院"的位置
                    int lastUniversityIndex = Math.max(
                            schoolName.lastIndexOf("大学"),
                            schoolName.lastIndexOf("学院")
                    );

                    if (lastUniversityIndex > 0) {
                        int suffixStartIndex = schoolName.indexOf(suffix);
                        if (suffixStartIndex > lastUniversityIndex) {
                            // 找到校区/分校名称的开始位置（在"大学"或"学院"之后）
                            int campusStart = lastUniversityIndex + 2; // "大学"或"学院"的长度
                            if (campusStart < suffixStartIndex) {
                                // 提取校区名称并加括号
                                String baseName = schoolName.substring(0, campusStart);
                                String campusName = schoolName.substring(campusStart);

                                // 生成带英文括号的版本：华北电力大学保定校区 -> 华北电力大学(保定校区)
                                variants.add(baseName + "(" + campusName + ")");
                                // 生成带中文括号的版本：华北电力大学保定校区 -> 华北电力大学（保定校区）
                                variants.add(baseName + "（" + campusName + "）");

                                // 生成去掉"校区"/"分校"的版本
                                // 华北电力大学保定校区 -> 华北电力大学(保定)
                                String campusNameWithoutSuffix = campusName.replace(suffix, "");
                                if (StrUtil.isNotBlank(campusNameWithoutSuffix)) {
                                    variants.add(baseName + "(" + campusNameWithoutSuffix + ")");
                                    variants.add(baseName + "（" + campusNameWithoutSuffix + "）");
                                }

                                break; // 找到一个就够了
                            }
                        }
                    }
                }
            }
        }

        // 6. 如果带括号，尝试生成括号内容加"校区"/"分校"的版本
        // 针对"XX大学(YY)"格式，生成"XX大学YY校区"等
        if (schoolName.contains("(") || schoolName.contains("（")) {
            // 提取括号内容
            String bracketContent = null;
            String baseName = null;

            if (schoolName.contains("(") && schoolName.contains(")")) {
                int start = schoolName.indexOf("(");
                int end = schoolName.indexOf(")");
                if (start < end) {
                    bracketContent = schoolName.substring(start + 1, end);
                    baseName = schoolName.substring(0, start);
                }
            } else if (schoolName.contains("（") && schoolName.contains("）")) {
                int start = schoolName.indexOf("（");
                int end = schoolName.indexOf("）");
                if (start < end) {
                    bracketContent = schoolName.substring(start + 1, end);
                    baseName = schoolName.substring(0, start);
                }
            }

            if (StrUtil.isNotBlank(bracketContent) && StrUtil.isNotBlank(baseName)) {
                // 如果括号内容不包含"校区"或"分校"，尝试添加
                if (!bracketContent.contains("校区") && !bracketContent.contains("分校")) {
                    // 生成加"校区"的版本：华北电力大学(保定) -> 华北电力大学保定校区
                    variants.add(baseName + bracketContent + "校区");
                    // 也生成带括号的版本：华北电力大学(保定) -> 华北电力大学(保定校区)
                    variants.add(baseName + "(" + bracketContent + "校区" + ")");
                    variants.add(baseName + "（" + bracketContent + "校区" + "）");

                    // 生成加"分校"的版本
                    variants.add(baseName + bracketContent + "分校");
                    variants.add(baseName + "(" + bracketContent + "分校" + ")");
                    variants.add(baseName + "（" + bracketContent + "分校" + "）");
                }
            }
        }

        return variants;
    }

    /**
     * 检查两个学校名称是否匹配（使用变体匹配）
     *
     * @param schoolName1 学校名称1
     * @param schoolName2 学校名称2
     * @return 是否匹配
     */
    public static boolean isSchoolNameMatch(String schoolName1, String schoolName2) {
        if (StrUtil.isBlank(schoolName1) || StrUtil.isBlank(schoolName2)) {
            return false;
        }

        // 生成两个名称的所有变体
        Set<String> variants1 = generateSchoolNameVariants(schoolName1);
        Set<String> variants2 = generateSchoolNameVariants(schoolName2);

        // 如果有任意变体匹配，则认为学校名称匹配
        for (String variant1 : variants1) {
            if (variants2.contains(variant1)) {
                return true;
            }
        }

        return false;
    }
}

